#include "huge.h"

//将字符数据转换成int类型数据，9个长度的为一个数据，调用atoi函数变为整形
//例如123456789087654321->第一个数据为087654321第二个数据为123456789
//倒着读入并转换成整形的
int convert(char *data,int *temp)//引入输入的数字和输入的数字转化为整形的数据
{
    int lenth=strlen(data);//获取输入数字长度
    int loopFromBackParam=0;//控制循环，从数据最后一个数据往前循环
    int saveEachNum=0;//控制分割输入数字的每一个字符保存入temp_data
    int getBackNumber=0;//用来返回数据转换了多少个9长度的整形数据
    char temp_data[9];//中间变量，存分割出来的9个字符


    for(loopFromBackParam=lenth-1; loopFromBackParam>=0; loopFromBackParam--)//从数据最后一个数据往前循环
    {
        temp_data[8 - saveEachNum] = data[loopFromBackParam];//9个数据为一组
        saveEachNum++;
        if(saveEachNum == 9)
        {
            saveEachNum=0;//如果已经填满了9个数字，即重新开始一边循环
            temp[getBackNumber]=atoi(temp_data);//转换成整形数据存入temp
            getBackNumber++;
            memset(temp_data,0,sizeof(temp_data));//清空用来存放分割出来的9个字符的数组，开始准备填入下一组9个字符
        }
    }
    if(lenth%9 == 0)//如果输入数字的长度正好是9的倍数
        return getBackNumber-1;
    while(saveEachNum < 9)//如果最后一个数据长度小于9，就填充0
    {
        temp_data[8 - saveEachNum] = '0';
        saveEachNum++;
    }
    temp[getBackNumber]=atoi(temp_data);//最后一个数据
    return getBackNumber;//返回一共得到多少个9个数字为一组的数组
}

int calc(int *data1, int dw1, int *data2, int dw2, int *result)//两个数字相加的计算函数
//引入参数：存放数字1的数组、数字1的数组下标、存放数字2的数组、数字2的数组下标、存放结果的数组
{
    int loopReadData1=0;//读入数字1的循环参数
    int loopReadData2=0;//读入数字2的循环参数
    int resultInsideParam=0;//控制result数组长度内部参数
    int diffOfData1=0;//数据1与1000000000的差值
    int diffOfData2=0;//数据2与diffOfData1的差值
    int carry=0;//是否进位的标志


    for(loopReadData1=0,loopReadData2=0; loopReadData1<=dw1 && loopReadData2<=dw2; loopReadData1++,loopReadData2++)
    {
        result[resultInsideParam] = data1[loopReadData1];//在存放结果的数组中存放数字1的数组
        diffOfData1 = MAX - data1[loopReadData1];//数据1与1000000000的差值
        diffOfData2 = data2[loopReadData2] - diffOfData1;//数据2与diffOfData1的差值
        if (diffOfData2 > 0)//其实diffOfData2的值就等于输入数字1的值和输入数字2的值的和减去1000000000，如果diffOfData2大于0，即数字1加数字2大于1000000000，代表需要进位
        {
            result[resultInsideParam] = diffOfData2+carry;//存放在结果的数组中的数字，就等于数字1的值和数字儿的值的和加上进位值
            carry = 1;
        }
        else//无需进位
        {
            result[resultInsideParam] += data2[loopReadData2]+carry;
            carry = 0;
        }
        resultInsideParam++;//控制result数组长度内部参数+1
    }

    while(loopReadData1 <= dw1)//数据1长度比数据2长时
    {
        if(carry == 1) //之前的数据是有进位的
        {
            if(data1[loopReadData1]+1 >= MAX)//如果进位超过了1000000000
            {
                result[resultInsideParam]=0;
                resultInsideParam++;//result数组长度内部参数+1
                loopReadData1++;//读入数字1的循环参数+1
                carry=1;
                continue;
            }
            result[resultInsideParam]=data1[loopReadData1]+1;
            carry=0;
        }
        else//之前的数据是没有进位的
            result[resultInsideParam]=data1[loopReadData1];
        resultInsideParam++;//结果的整形数组存入数据的个数+1
        loopReadData1++;
    }

    while(loopReadData2<=dw2)//数据2长度比数据1长时，处理方式和上面差不多
    {
        if(carry==1)
        {
            if(data2[loopReadData2]+1 >= MAX)
            {
                result[resultInsideParam]=0;
                resultInsideParam++;
                loopReadData2++;
                carry=1;
                continue;
            }
            result[resultInsideParam]=data2[loopReadData2]+1;
            carry=0;
        }
        else
            result[resultInsideParam]=data2[loopReadData2];
        resultInsideParam++;
        loopReadData2++;
    }

    if(carry==1)//如果有进位
    {
        result[resultInsideParam]=1;
        resultInsideParam++;//结果的整形数组存入数据的个数+1
    }

    return resultInsideParam-1;//返回结果的整形数组存入数据的个数
}
